﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Sakura.Games.StgFramework
{
	/// <summary>
	/// 提供对于数据绑定所需的接口的标准实现。
	/// </summary>
	[Serializable]
	public abstract class BindableBase : INotifyPropertyChanged, IDataErrorInfo
	{
		/// <summary>
		/// 初始化一个对象的新实例。
		/// </summary>
		protected BindableBase()
		{
		}


		#region INotifyPropertyChanged 成员

		/// <summary>
		/// 当属性发生更改时引发。
		/// </summary>
		[field: NonSerialized]
		public event PropertyChangedEventHandler PropertyChanged;

		/// <summary>
		/// 引发 PropertyChanged 事件。
		/// </summary>
		/// <param name="e">事件包含的参数。</param>
		protected void OnPropertyChanged(PropertyChangedEventArgs e)
		{
			if (this.PropertyChanged != null)
			{
				this.PropertyChanged(this, e);
			}
		}

		/// <summary>
		/// 引发 PropertyChanged 事件。
		/// </summary>
		/// <param name="propertyName">发生更改的属性的名称。</param>
		protected void OnPropertyChanged(string propertyName)
		{
			this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
		}

		#endregion

		#region IDataErrorInfo 成员

		/// <summary>
		/// 获得对象的错误信息。
		/// </summary>
		protected virtual string Error
		{
			get
			{
				return null;
			}
		}

		/// <summary>
		/// 获得对象指定列的错误信息。
		/// </summary>
		/// <param name="columnName">要获取的错误的列。</param>
		/// <returns>该列的错误信息。</returns>
		protected virtual string GetError(string columnName)
		{
			return null;
		}


		/// <summary>
		/// 获得对象的错误信息。
		/// </summary>
		string IDataErrorInfo.Error
		{
			get
			{
				return this.Error;
			}
		}

		/// <summary>
		/// 获得对象指定列的错误信息。
		/// </summary>
		/// <param name="columnName">要获取的错误的列。</param>
		/// <returns>该列的错误信息。</returns>
		string IDataErrorInfo.this[string columnName]
		{
			get
			{
				return this.GetError(columnName);
			}
		}

		#endregion
	}
}
